#ifndef _SHAPE_H 
#define _SHAPE_H

#include <GL/glew.h>
#include <GL/glut.h>
#include <GL/gl.h>										
#include <GL/glu.h>

#include <iostream>

#include "geometry.h"

// ==================== CUBE ==================== //
class Cube
{
	public:
		Cube(const Vector&,const Vector&);
		virtual void Render();

	protected:
		Vector a;
		Vector b;
};

// =============== PRISM TRIANGLE =============== //
class PrismTriangle : public Triangle
{
	public:
		PrismTriangle(const Vector& a, const Vector& b, const Vector& c, const double& _h)  : Triangle(a, b, c), h(_h) {}
		PrismTriangle(const Triangle&, const double& h);
		virtual void Render();

	protected:
		double h;
};

// ================= PRISM QUAD ================= //
class PrismQuad : public Quadrangle
{
	public:
		PrismQuad(const Vector& a, const Vector& b, const Vector& c, const Vector& d, const double& _h) : Quadrangle(a, b, c, d), h(_h) {}
		PrismQuad(const Quadrangle&, const double&);
		virtual void Render();
	
	protected:
		double h;
};

// =================== TOIT ===================== //
class Toit : public Quadrangle
{
	public:
		Toit(const Vector& a, const Vector& b, const Vector& c, const Vector& d, const double& _h) : Quadrangle(a, b, c, d), h(_h) {}
		Toit(const Quadrangle&, const double&);
		virtual void Render();
	
	protected:
		double h;
};

// ================== TOIT 2 ==================== //
class Toit2 : public Quadrangle
{
	public:
		Toit2(const Vector& a, const Vector& b, const Vector& c, const Vector& d, const double& _h) : Quadrangle(a, b, c, d), h(_h) {}
		Toit2(const Quadrangle&, const double&);
		virtual void Render();
	
	protected:
		double h;
};

// ================= CYLINDRE =================== //
class Cylindre : public Quadrangle
{
	public:
		Cylindre(const Vector&, const Vector&, const Vector&, const Vector&, const double&);
		Cylindre(const Quadrangle&, const double&);
		virtual void Render();
	
	protected:
		double h;
		Vector centre;
};

// Permet de definir une matiere a partir d'une couleur
inline void GlutShade(GLfloat r,GLfloat v,GLfloat b)
{
	// Couleur sans lumieres
	glColor3f(0.2,0.7,0.6);

	// Couleur avec lumieres
	GLfloat color[4];

	// La couleur diffuse sera egale a 87,5% de la couleur
	color[0]=0.875f*r;
	color[1]=0.875f*v;
	color[2]=0.875f*b;
	color[3]=1.0;

	glMaterialfv(GL_FRONT, GL_DIFFUSE, color);

	// La couleur ambiante sera egale a 12,5% de la couleur
	color[0]=0.125f*r;
	color[1]=0.125f*v;
	color[2]=0.125f*b;
	color[3]=1.0;

	glMaterialfv(GL_FRONT, GL_AMBIENT, color); // GL_AMBIENT_AND_DIFFUSE

	color[0]=1.0f;
	color[1]=0.0f;
	color[2]=0.0f;
	color[3]=1.0;

	glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, color);
}

#endif // _SHAPE_H
